package cn.tansanqinger.linked;
interface IStack<T>{
    void push(T data);//添加数据
    boolean empty();//如果栈为空返回true，否则返回false
    int size();//返回栈中元素的个数
    void pop();//删除栈顶元素但不返回其值
    T top();//返回栈顶的元素，但不删除该元素
}
class StackImpl<T> implements IStack<T>{
    private Node top;//栈顶
    private int size;//栈中数据
    @Override
    public void push(T data) {//添加数据
        Node node = new Node(data);
        if(this.top== null){//判断栈是否有数据
            this.top = node;
        } else {
            node.last = this.top;//压入数据
            this.top = node;
        }
        this.size ++;//栈中数据+1
    }

    @Override
    public boolean empty() {
        return this.top!=null;//通过判断指针指向情况
        //return this.size != 0;//通过判断个数也是可以的
    }

    @Override
    public int size() {
        return this.size;
    }

    @Override
    public void pop() {
        this.top();
    }

    @Override
    public T top() {
        Object data = this.top.data;
        this.top = top.last;//指针上移
        this.size --;
        return (T) data;
    }

    private class Node<T>{//链表结点
        private T data;
        private Node last;//保存上一个结点
        private  Node(T data){
            this.data = data;
        }
    }
}
public class SimulateStackDemo {
    public static void main(String[] args) {
        IStack<String> stack = new StackImpl<>();
        stack.push("A");
        System.out.println("弹出的数据为："+stack.top()+"堆栈中剩余："+stack.size());
        stack.push("B");
        stack.push("C");
        stack.push("D");
        while(stack.empty()){
            System.out.println("弹出的数据为："+stack.top()+"堆栈中剩余："+stack.size());
        }
    }
}
